% imgsize => Image size ... Seitenlaenge des Bildes. Das Bild muss ein Quadrat sein und die Seitenlaenge muss durch die Blockgroesse ohne Rest teilbar sein.
% bs => Block size ... Seitenlaenge der Blockgroesse. Der Block muss
%   quadratisch sein; die Seitenlaenge muss durch die Blockgroesse ohne Rest teilbar sein
function exercise1b (img, bs) % E.g. 'exercise1b('walter.png', 16)'

%% Initialisierung
%bs = 16; %Block size ... Die Blockgroesse muss quadratisch sein
%imgsize = 256; %Image size ... Das Bild muss ein Quadrat sein und die Seitenlaenge muss durch die Blockgroesse ohne Rest teilbar sein.

try %Versuche das Bild einzulesen
    A = imread(strcat('img', filesep, img)); % Einlesen des Bildes aus Bilderordner 'img/'
catch exception
    disp(exception.message);
    disp('Image could not be loaded');
end
try %Verifizieren der uebergebenen Blocksize und Sicherstellen der notwendigen Eigenschaften
    bs = double(bs);
    if (size(A,1) ~= size(A,2)) % Pruefe ob beide Dimensionen des eingelesenen Bildes uebereinstimmen
        throw('Image is not square');
    else
        imgsize = length(A);
    end
catch exception
    disp(exception.message);
    disp('Blocksize is mandatory, has to be an exact fraction of the image size and has to be of type Integer');
end

H = cell(imgsize:1); %Initialisieren des Blockarrays. Es wird alle Block-Histogramme beinhalten.
k = 0; % Blockzaehler als Index fuer das cell array H
%correct(1:256) = 1;
%% Berechnen der Histogramme jedes einzelnen 16x16 Pixel Blocks im Bild
for i=1:(imgsize/bs) % Fur jede bs-Pixel hohe Zeile i
    for j =1:bs % Fuer jeden bs-Pixel breiten Block j in Zeile i wird ein Histogramm berechnet
        k = k+1; %Inkrementieren des Blockzaehlers
        row = 1+(bs*(i-1)) : bs*i; % Zeilen des aktuellen Blocks im Bild a
        col = 1+(bs*(j-1)) : bs*j; % Spalten des aktuellen Blocks im Bild a
        
        %lo = [1+(bs*(i-1)), 1+(bs*(j-1))]; %links oben aktueller Block
        %lu = [1+(bs*(i-1)), bs*j]; %links unten aktueller Block
        %ro = [bs*i, 1+(bs*(j-1))]; %rechs oben aktueller Block
        %ru = [bs*i, bs*j]; %rechts unten aktueller Block
        
        H{k} = imhist( A(row, col), 256); %Berechnung des Histogramms des ausgewaehlten Bereichs (aktueller Block)
        %c = sum(H{k});
        %if c ~= 256
        %    correct(1,k) = 0;
        %else
        %    correct(1,k) = 1;
        %end
        %correct(2,k) = c;
        subplot(bs, bs, k); bar(1:256, H{k}, 'r'); %, 'DisplayName', 'hist_temp(1:256,1)', 'YDataSource', 'hist_temp(1:256,1)'); figure(gcf)
    end;
end;
